【JavaScirpt】replace完全マニュアル | 置換, 抽出, メタ文字の利用などを解説
この記事では、
- 特定の文字列を別の文字列に置換する方法を知りたい
- テキスト内の全ての指定した文字や単語を置換したい
- 正規表現を使用して複雑なパターンの文字列を置換したい方法を探している
- プログラミング初心者として、replace関数の基本的な使い方を学びたい
- JavaScriptのreplace関数とreplaceAll関数の違いと使い分けについて知りたい
という悩みを抱えている向けに、
- JavaScriptでの文字列置換の基本から応用まで
- 正規表現を駆使した効率的な文字列操作
- replace関数とreplaceAll関数の違いとその使い分け
について解説していきたいと思います。
目次 (PRも含まれます)
JavaScriptで文字列を操作する:replaceメソッドの解説
本セクションではJavaScriptのreplace
メソッドに焦点を当て、基本的な使い方から応用技法までを学びましょう。
replaceメソッドによる文字の置換
replace
メソッドを使用すると、文字列内の最初に見つかった部分文字列を、指定した文字列に置換することができます。以下のコードでは、"Hello world!"
という文字列内の"world"
を"JavaScript"
に置換しています。
let str = "Hello world!";
let newStr = str.replace("world", "JavaScript");
console.log(newStr); // "Hello JavaScript!"
なお、replace
メソッドの基本的な構文は以下の通りです。
let result = str.replace(regexp|substr, newSubstr|function)
regexp|substr
は、置換対象の文字列または正規表現パターンです。newSubstr|function
は、置換後の文字列または置換を定義する関数です。
replaceAllメソッドによる全文字の置換
replaceAll
メソッドは、指定したパターンに一致するテキストを文書全体で置換するために使用します。これはreplace
メソッドと似ていますが、全ての一致を置換する点が異なります。
以下のコードは、"World"
という単語が複数回出現している文字列を置換する例です。replace
メソッドを使用した場合は1回目の"World"
のみが"JavaScript"
に置換されますが、replaceAll
メソッドを使用した場合には全ての"World"
が置換されています。
let str = "Hello World! World is wonderful.";
//replaceを使用した場合
let newStr = str.replace("World", "JavaScript");
console.log(newStr); // "Hello JavaScript! World is wonderful."
//replaceAllを使用した場合
let newStrAll = str.replaceAll("World", "JavaScript");
console.log(newStrAll); // "Hello JavaScript! JavaScript is wonderful."
正規表現を使用した柔軟な文字列置換
正規表現は、パターンマッチングとテキスト処理の強力なツールです。JavaScriptのreplace
メソッドと組み合わせることで、柔軟な置換操作が可能になります。
正規表現の基本と応用
正規表現を使用することで、特定のパターンに一致するテキストの抽出や置換が簡単に行えます。例えば、全ての空白文字を除去する場合、以下のように書けます。
let str = "Hello World! ";
let newStr = str.replace(/\s+/g, "");
console.log(newStr); // "HelloWorld!"
この例では、\s+
の正規表現が1つ以上の空白文字にマッチし、g
フラグが全体を対象としています。その結果、全ての空白文字が除去されます。
正規表現とgフラグを用いたグローバル置換
正規表現にg
(グローバル)フラグを付けることで、テキスト内の全てのマッチに対して置換を行うことができます。これはreplaceAll
メソッドと似ていますが、より柔軟なパターンを指定できるという利点があります。
let str = "The rain in SPAIN stays mainly in the plain";
let newStr = str.replace(/ain/gi, "0");
console.log(newStr); // "The r0 in SP0 stays m0ly in the pl0"
この例では、/ain/gi
正規表現を使っていて、ain
にマッチするすべての文字列を"0"
に置換しています。i
フラグは大文字小文字を区別しないことを意味します。
replaceメソッドの応用例
replaceメソッドはさまざまなシチュエーションで柔軟に活用できる非常に強力なツールです。ここでは、言語処理やデータ処理における応用例をいくつか紹介します。
文字列内の特定パターンの置換
ウェブ開発では、ユーザー入力やテキストデータのクリーニングにreplaceメソッドがよく使われます。特定のフォーマットに合わせるために、特定のパターンや不要な文字を除去するのに役立ちます。
let str = "This is an email: example@example.com";
let newStr = str.replace(/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})/, '<a href="mailto:$1">$1</a>');
console.log(newStr); // "This is an email: <a href="mailto:example@example.com">example@example.com</a>"
この例では、Eメールアドレスに一致するパターンを、メールリンクのHTMLに置換しています。
関数を使用した動的な文字列置換
replaceメソッドには、第二引数に関数を指定することもできます。これにより、マッチした各部分に対して動的に置換文字列を生成することができます。
let str = "10 times 20 equals 200";
let newStr = str.replace(/\b(\d+)\b/g, (match, num) => Number(num) * 2);
console.log(newStr); // "20 times 40 equals 400"
このコードでは、数字に一致する部分を検出し、その数字を2倍に置換しています。
JavaScriptのreplace関数による高度な文字列操作
JavaScriptのreplace関連関数を駆使することで、編集作業やデータ処理を大幅に自動化し、効率化することができます。
改行コードの置換や空白の削除
テキストデータの整形や前処理では、不要な空白や改行の削除がしばしば必要になります。
let str = "This\nis a\nmultiline\ntext.";
let newStr = str.replace(/\n/g, " ");
console.log(newStr); // "This is a multiline text."
この例では、改行コードを単一のスペースに置換して、テキストを1行に整形しています。
数値や特殊文字の置換パターン
特定の条件に基づいた数値や特殊文字の置換も、replace関数を使って簡単に実装できます。
let str = "I have 100 dollars and 15 cents.";
let newStr = str.replace(/(\d+)/g, "$$$1");
console.log(newStr); // "I have $100 dollars and $15 cents."
このコードでは、数字に一致するすべての部分を、その前にドル記号を付加する形で置換しています。
replaceとreplaceAllの違いと使い分け
replace
メソッドとreplaceAll
メソッドは似ていますが、replace
メソッドは最初に見つかった部分のみを置換し、replaceAll
は文書全体のマッチするすべての部分を置換します。この違いを正しく理解し、それぞれの場面で適切に使い分けることが重要です。
replaceメソッドとreplaceAllメソッドの比較
replace
メソッドは、正規表現にg
フラグを使用することでreplaceAll
メソッドと同様の振る舞いをすることが可能です。しかしreplaceAll
メソッドはこのフラグなしでも文書全体の置換を行います。
let str = "fooBar fooBar fooBar";
console.log(str.replace(/foo/g, "bar")); // "barBar barBar barBar"
console.log(str.replaceAll("foo", "bar")); // "barBar barBar barBar"
IE11など古いブラウザでの対応策
replaceAll
メソッドは比較的新しいため、古いブラウザではサポートされていないことがあります。そのような場合、replace
メソッドと正規表現の組み合わせを利用することで同様の結果を得ることができます。
let str = "fooBar fooBar fooBar";
let newStr = str.replace(/foo/g, "bar"); // IE11でも問題なく動作する
console.log(newStr); // "barBar barBar barBar"
また、Node.js
でreplaceAll
メソッドを使用してエラーになるケースもあります。これは、replaceAll
メソッドがバージョンが15からのみサポートしているためです。
このようにreplaceAll
メソッドはブラウザごとに互換性が異なるので注意しましょう。以下の表は、ブラウザの互換性をまとめたものです。
Chrome | 85 (Released 2020-08-25) | |
Edge | 85(Released 2020-08-27) | |
Firefox | 77(Released 2020-06-02) | |
Opera | 71 (Released 2020-09-15) | |
Safari | 13.1 (Released 2020-03-24) | |
Chrome Android | 85 (Released 2020-08-25) | |
Firefox for Android | 79 (Released 2020-07-28) | |
Opera Android | 60 (Released 2020-09-23) | |
Safari on iOS | 13.4 (Released 2020-03-24) | |
Samsung Internet | 14.0 (Released 2021-04-17) | |
WebView Android | 85 (Released 2020-08-25) | |
Deno | 1.2 (Released 2020-07-13) | |
Node.js | 15.0.0 (Released 2020-10-20) |
参照:MDN Web Docs: String.prototype.replaceAll()
文字列操作の補助技:splitとjoinの組み合わせ
時には、replace
やreplaceAll
よりもsplit
とjoin
を組み合わせた方が直感的に問題を解決できることがあります。これは特に、特定の文字やパターンで文字列を区切り、それぞれの部分を変換した後に再組み立てしたい場合に便利です。
splitとjoinによる置換の実例
split
は、パターンを受け取り、String
をパターン検索によって部分文字列の順序付きリストに分割し、これらの部分文字列を入れた配列を返します。またjoin
は Array
インスタンスのメソッドで、配列の全要素を順に連結した新しい文字列を返します。
以下の例では、カンマで区切られた文字列内の数字を括弧で囲みます。
let str = "1,2,3,4,5";
let parts = str.split(",");
let transformedParts = parts.map(part => `(${part})`);
let newStr = transformedParts.join(",");
console.log(newStr); // "(1),(2),(3),(4),(5)"
このアプローチは、元の文字列を部分的に分解し、各部分を個別に処理してから再結合する場合に特に有用です。
JavaScriptの文字列操作は非常に強力で、データ処理からUIの動的変更まで幅広い用途に使用できます。本記事で紹介したreplace
メソッドを始めとする文字列操作の技術をマスターすることで、JavaScript開発の幅を広げることができるでしょう。